import { mapState } from "vuex";
export default {
  install(Vue) {
    /**
     * 过滤权限，与关系的匹配 如果匹配不上则找到父元素然后删除当前子元素
     * @param {*} el 当前dom
     * @param {*} binding 绑定的数据
     * @param {*} vnode  虚拟dom中的数据
     */
    const filterPermission = (el, binding, vnode) => {
      const permission = binding.value;
      if (typeof permission === "string") {
        if (vnode.context.permission.indexOf(binding.value) === -1) {
          el.parentNode && el.parentNode.removeChild(el);
        }
      } else if (Array.isArray(permission)) {
        let isRemove = false;
        permission.forEach((item) => {
          console.log(vnode.context.permission.indexOf(item) === -1);
          if (vnode.context.permission.indexOf(item) === -1) {
            isRemove = true;
          }
        });
        console.log(isRemove);
        if (isRemove) {
          el.parentNode && el.parentNode.removeChild(el);
        }
      }
    };

    /**
     * 过滤权限，或关系的匹配 如果匹配不上则找到父元素然后删除当前子元素
     * @param {*} el 当前dom
     * @param {*} binding 绑定的数据
     * @param {*} vnode  虚拟dom中的数据
     */
    const filterOrPermission = (el, binding, vnode) => {
      const permission = binding.value;
      if (typeof permission === "string") {
        if (vnode.context.permission.indexOf(binding.value) === -1) {
          el.parentNode && el.parentNode.removeChild(el);
        }
      } else if (Array.isArray(permission)) {
        let isRemove = true;
        for (let i = 0; i < permission.length; i++) {
          if (vnode.context.permission.indexOf(permission[i]) !== -1) {
            isRemove = false;
            return;
          }
        }
        if (isRemove) {
          el.parentNode && el.parentNode.removeChild(el);
        }
      }
    };
    // v-has 指令 与匹配 判断权限
    Vue.directive("has", {
      inserted: filterPermission,
      update: filterPermission,
    });
    // v-hasor 指令 或匹配 判断权限
    Vue.directive("hasor", {
      inserted: filterOrPermission,
      update: filterOrPermission,
    });

    /**
     * 过滤权限，与关系的匹配 如果匹配不上则找到父元素然后删除当前子元素
     * @param {*} el 当前dom
     * @param {*} binding 绑定的数据
     * @param {*} vnode  虚拟dom中的数据
     */
    const filterRole = (el, binding, vnode) => {
      const role = binding.value;
      if (typeof role === "string") {
        if (vnode.context.roles.indexOf(role) === -1) {
          el.parentNode && el.parentNode.removeChild(el);
        }
      } else if (Array.isArray(role)) {
        let isRemove = false;
        role.forEach((item) => {
          if (vnode.context.roles.indexOf(item) === -1) {
            isRemove = true;
          }
        });
        if (isRemove) {
          el.parentNode && el.parentNode.removeChild(el);
        }
      }
    };

    /**
     * 过滤权限，或关系的匹配 如果匹配不上则找到父元素然后删除当前子元素
     * @param {*} el 当前dom
     * @param {*} binding 绑定的数据
     * @param {*} vnode  虚拟dom中的数据
     */
    const filterOrRole = (el, binding, vnode) => {
      const role = binding.value;
      if (typeof role === "string") {
        if (vnode.context.roles.indexOf(role) === -1) {
          el.parentNode && el.parentNode.removeChild(el);
        }
      } else if (Array.isArray(role)) {
        let isRemove = true;
        for (let i = 0; i < role.length; i++) {
          if (vnode.context.roles.indexOf(role[i]) !== -1) {
            isRemove = false;
            return;
          }
        }
        if (isRemove) {
          el.parentNode && el.parentNode.removeChild(el);
        }
      }
    };

    // v-has 指令 与匹配 判断权限
    Vue.directive("hasrole", {
      inserted: filterRole,
      update: filterRole,
    });
    // v-hasor 指令 或匹配 判断权限
    Vue.directive("hasroleor", {
      inserted: filterOrRole,
      update: filterOrRole,
    });
    /**
     * 将权限混合到各个组件中，方便使用
     */
    Vue.mixin({
      computed: {
        ...mapState("permission", {
          permission: (state) => state.permission,
          roles: (state) => state.roles,
        }),
      },
    });
  },
};
